#if 0
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
/*
    重要函数：
    sighandler_t signal(int signum, sighandler_t handler):创建一个信号
        SIGCHLD 子进程结束/停止 父进程会收到这个信号
    pid_t fork(void):
        创建一个进程
    kint kill(pid_t pid, int sig):
        给指定信号接收者发指定信号
    pid_t wait(int *wstatus):
        等待任意子进程退出
    void chdir(const char *path):
        切换路径
    char *getcwd(char *buf, size_t size):
        获取指定绝对路径(size=sizeof(buf))
    DIR * opendir(const char *name):
        打开一个目录，返回一个DIR类型
    struct dirent *readdir(DIR *dirp):
        读打开的目录的返回值，返回下一个目录下的指针
    int stat(const char *pathname, struct stat *statbuf):
        获取文件属性，存放于statbuf结构体中
    int closedir(DIR *dirp):
        关闭一个目录
*/

struct Head* search_music_file(const char* pathname);
void childnext_handler(int sig);
int main(int argc, char** argv)
{
    pid_t pid;
    int next_action = 0; //0 - 没有动作, 1:上一曲  2:下一曲 3:暂停播放 4:继续播放 5:退出音乐播放器
    int mad_exited = 0; //0 - 没有退出  1 - 退出

    signal(SIGCHLD, childnext_handler);

    struct Head* h = create_list();
    //搜索目录,找到所有的音乐文件 
    h = search_music_file(argv[1]);
    if (h == NULL)
    {
        printf("search music file return NULL\n");
        return -1;
    }

    Node* p = h->first; //p指向链表的第一个数据结点
    while (p)
    {
        pid = fork();
        if (pid == 0)
        {
            //子进程执行播放音乐操作
            execlp("madplay", "madplay", p->filename, NULL);
        }
        else if (pid > 0)
        {
            while (!mad_exited)
            {
                //父进程获取用户的输入
                char ch = getchar();
                switch (ch) //'n/N' 下一曲 'p/P' 上一曲 ......
                {
                case 'n':
                case 'N':
                    next_action = 2;//下一曲
                    break;
                case 'p':
                case 'P':
                    next_action = 1;//上一曲
                    break;
                case 'q':
                case 'Q':
                    next_action = 5; //退出 
                    break;
                case 's':
                case 'S':
                    next_action = 3;
                    break;
                case 'c':
                case 'C':
                    next_action = 4;
                    break;
                    //......

                }
                if (next_action == 1 || next_action == 2 || next_action == 5)
                {
                    //都要将子进程(madplay)干掉
                    kill(pid, SIGKILL);
                    mad_exited = 1;
                }
                else if (next_action == 3)
                {
                    kill(pid, SIGSTOP);
                }
                else if (next_action == 4)
                {
                    kill(pid, SIGCONT);
                }
            }
            wait(NULL); //等待任意一个子进程退出
            //waitpid(-1, NULL , 0);
        }
        else
        {
            perror("fork error");
            return -1;
        }

        if (next_action == 2) //next
        {
            p = p->next;
        }
        else if (next_action == 1)// prev 
        {
            p = p->prev;
        }
        else if (next_action == 5)
        {
            break; //退出
        }
    }
}

//从指定的路径中，找到所有的音乐文件
//将文件信息保存至 链表中
struct Head* search_music_file(const char* pathname)
{
    //切换到 pathname工作目录下
    chdir(pathname);
    //获取绝对路径
    char path_abs[256];
    getcwd(path_abs, 256);

    DIR* dp = opendir(pathname);
    if (dp == NULL)
    {
        perror("opendir error");
        return NULL;
    }


    //读取目录项
    struct dirent* dirp = NULL;
    while (1)
    {
        dirp = readdir(dp);
        if (dirp == NULL)
        {
            perror("readdir : ");
            break;
        }

        //排除 . 和 ..
        if (!strcmp(dirp->name, ".") ||
            !strcmp(dirp->name), "..")
        {
            continue;
        }

        char path[512];
        sprintf(path, "%s\%s", path_abs, dirp->name);

        struct stat st;
        int r = stat(path, &st); //获取属性
        if (r == -1)
        {
            perror("stat error");
            return NULL;
        }

        //判断是否为 .mp3 文件
        if (S_ISREG(st.st_mode))
        {
            if (!strncmp(".mp3", path + (strlen(path) - 4), 4))
            {
                //创建一个链表的结点，将mp3的文件信息保存到
                //结点，并且将该结点添加到链表中去
                Add_Node_List();
            }
        }
        else if (S_ISDIR(st.st_mode))
        {
            //目录文件，则再找到目录中的所有mp3
        }
    }

    closedir(dp);
}


#endif